计划阅读调试下Dubbo的源码,结合官方源码分析Dubbo,自身再分析总结
本文对应的Dubbo 服务引入
源码分析
订阅
上一篇分析了Dubbo服务引入的整体流程。我发现一直没有看到DubboProtocol的部分。重新debug之后,发现漏了一些流程
首先先找到DubboProtocol#ref方法的堆栈
梳理下它的调用链
RegistryProtocol#doRefer -> RegistryDirectory#subscribe -> FailbackRegistry#subscribe -> ZookeeperRegistry#doSubscribe ->
FailbackRegistry#notify -> FailbackRegistry#doNotify -> AbstractRegistry#notify -> RegistryDirectory#notify ->
RegistryDirectory#refreshInvoker -> RegistryDirectory#toInvokers -> Protocol的动态类以及一些Wrapper -> DubboProtocol#refer
调用链是比较复杂的,从registryProtocol的refer ,在经过RegistryDirectory以及其基类之间的调用,最终将其转化为invoker,再最后调用到DubboProtocol#refer做最后的处理。从调用链可以看出RegistryDirectory是作为字典的存在,用来保证注册中心的节点变动实时体现在Invoker上
回到RegistryProtocol#doRefer中
1 | private <T> Invoker<T> doRefer(Cluster cluster, Registry registry, Class<T> type, URL url) { |
进入directory#subscribe
方法内
1 | public class RegistryDirectory<T> extends AbstractDirectory<T> implements NotifyListener { |
1 | public abstract class FailbackRegistry extends AbstractRegistry { |
TODO refresh invokers 等后续流程